package practica;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import aima.search.framework.HeuristicFunction;
import aima.search.framework.Successor;
import aima.search.framework.SuccessorFunction;

/** 
 * Clase generadora de estados succesores para el algoritmo Simulated Annealing.
 * @author	Mauro Vime Castillo <mauro.vime@est.fib.upc.edu>, Arnau Soler <arnau.soler@est.fib.upc.edu> y Roger Noguera <roger.noguera@est.fib.upc.edu>
 */
public class EstadosSucesoresSA implements SuccessorFunction {
	
	/**
	* Constructora vacia. 
	*/
	public EstadosSucesoresSA() {}
	
	/** 
     * Funcion generadora de estados succesores.
     * @param state Estado actual sobre el que generar los sucesores.
     * @return List Lista con todos los estados sucesores (que en este caso tendra un solo estado).
     */
	@Override
	public List getSuccessors(Object state) {
		EstadoSensores estado = (EstadoSensores)state;
		ArrayList<Successor> sucesores = new ArrayList<Successor>();
		EstadoSensores newestado = estado.clonar();
		int i, j;
		Random rand = new Random();
		while (sucesores.isEmpty()) {
			int random_operation = rand.nextInt(3);
			switch (random_operation) {
			case 0:
				i = rand.nextInt(estado.getnumsens());
				j = rand.nextInt(estado.getnumsens()+estado.getnumcent());
				do {
					j = rand.nextInt(estado.getnumsens()+estado.getnumcent());
				} while (i == j);
				if (newestado.MoverConexion(i,j)) {
					String s = estado.MOV_CONEXION; 
					sucesores.add(new Successor(s,newestado));
				}
				break;
			case 1:
				i = rand.nextInt(estado.getnumsens());
				if (newestado.EliminarConexion(i)) {
					String s = estado.ELI_CONEXION;
					sucesores.add(new Successor(s,newestado));
				}
				break;
			case 2:
				i = rand.nextInt(estado.getnumsens());
				j = rand.nextInt(estado.getnumsens()+estado.getnumcent());
				do {
					j = rand.nextInt(estado.getnumsens()+estado.getnumcent());
				} while (i == j);
				if (newestado.NuevaConexion(i,j)) {
					String s = estado.NEW_CONEXION;
					sucesores.add(new Successor(s,newestado));
				}
			}
		}
		return sucesores;
	}
}

